package gateway

import (
	"context"
	"fmt"
	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
	"log"
	"net/http"
	"goods-srv/client"
	healthpb "goods-srv/gen/health"
	userpb "goods-srv/gen/user"
	"goods-srv/libs"
)

// Run 对外提供 http 协议的服务，就是通过http代理 grpc客户端
func Run() error {
	ip := "0.0.0.0"
	port := libs.AppConfig.GatewayPort

	address := fmt.Sprintf("%s:%d", ip, port)

	// http api -> http服务 -> 多路复用(http中间件) -> grpc网关代理grpc服务[grpc客户端] -> (中间件) -> 服务
	ctx := context.Background()
	// 获取单机版grpc服务连接
	//conn, err := client.GetClientConn(ctx)

	// 获取注册在 consul 上的grpc服务连接
	conn, err := client.GrpcConsulClientConn(libs.AppConfig.Name)
	if err != nil {
		return err
	}

	// 多路复用中间件，如令牌校验中间件。
	var sp []runtime.ServeMuxOption

	// 多路复用
	mux := runtime.NewServeMux(sp...)

	// [注册用户服务http api] -> 多路复用 -> grpc连接
	if err = healthpb.RegisterHealthHandler(ctx, mux, conn); err != nil {
		return err
	}
	if err = userpb.RegisterUserHandler(ctx, mux, conn); err != nil {
		return err
	}

	//http服务代理多路复用
	server := http.Server{
		Addr:    address,
		Handler: mux,
	}

	log.Printf("grpc server gateway listening at %v", address)
	err = server.ListenAndServe()
	return err
}
